#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include "libConsola.h"
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>

chs_t proximoSectorF(char* mensaje) {
	chs_t rta;
	rta.cilindro = (uint8_t) mensaje[7] * 256 + (uint8_t) mensaje[8];
	rta.pista = (uint8_t) mensaje[9] * 256 + (uint8_t) mensaje[10];
	rta.sector = (uint8_t) mensaje[11] * 256 + (uint8_t) mensaje[12];
	return rta;
}

chs_t sectorSiguienteF(char* mensaje) {
	chs_t rta;
	rta.cilindro = (uint8_t) mensaje[13] * 256 + (uint8_t) mensaje[14];
	rta.pista = (uint8_t) mensaje[15] * 256 + (uint8_t) mensaje[16];
	rta.sector = (uint8_t) mensaje[17] * 256 + (uint8_t) mensaje[18];
	return rta;
}

void llegarAPosicion(chs_t cabezal, chs_t pos, chs_t sig, chs_t CHS, uint16_t RPM, uint16_t tiempoSaltoPistas) {
	uint32_t tiempo;
	printf("posicion actual: %d:%d\n", cabezal.pista, cabezal.sector);
	printf("sector solicitado: %d:%d\n", pos.pista, pos.sector);

	if (((CHS.sector) < (pos.sector)) || ((CHS.sector) < (cabezal.sector))) {
		printf("error, muchos sectores ");
	} else if (((CHS.pista) < (pos.pista)) || ((CHS.pista) < (cabezal.pista))) {
		printf("error, hay menos pistas que la solicitada");
	} else {
		printf("sectores recorridos: ");
		while ((cabezal.pista) != (pos.pista)) {
			if ((cabezal.pista) > (pos.pista)) {
				cabezal.pista--;

			} else {
				cabezal.pista++;
			}
			printf("%d:%d, ", cabezal.pista, cabezal.sector);

		}
		while ((cabezal.sector) != (pos.sector)) {
			if ((cabezal.sector) == CHS.sector) {
				cabezal.sector = 0;
			} else {
				(cabezal.sector)++;
			}
			printf("%d:%d", cabezal.pista, cabezal.sector);

			if (abs(cabezal.sector - pos.sector) >= 1) {
				printf(", ");
			} else {
				printf(".\n");
			}
		}
	}
	tiempo = buscarTiempo(pos, RPM, cabezal, CHS, tiempoSaltoPistas);
	printf("tiempo Consumido: %d ms\n", tiempo);
	printf("Proximo Sector: %d:%d:%d\n", sig.cilindro, sig.pista, sig.sector);
}

uint8_t cantidadSectoresSolicitados(char* mensaje) {
	uint8_t rta = 0;
	uint16_t i = 0;
	while (mensaje[i] != ' ') {
		i++;
	}
	i++;
	for (; mensaje[i] != '\0'; i++) {
		if (mensaje[i] == ' ')
			rta++;
	}
	rta++;
	return rta;
}



uint16_t buscarTiempo(chs_t posicion, uint16_t RPM, chs_t cabezal, chs_t CHS, uint16_t tiempoSaltoPistas) {
	printf("inicio tiempo \n");
	float tiempoPorSector;
	uint16_t sectoresAtravezados;
	uint16_t tiempoPista, tiempoSector;
	tiempoPorSector = (1 / (((float) RPM) / 60000)) / CHS.sector;
	printf("tiempo por sector: %2f ms\n", tiempoPorSector);
	if (posicion.pista != cabezal.pista) {
		tiempoPista = (abs(posicion.pista - cabezal.pista) * tiempoSaltoPistas);
	}
	printf("tiempo pista: %d ms\n", tiempoPista);
	if (posicion.sector > cabezal.sector) {
		sectoresAtravezados = posicion.sector - cabezal.sector;
	} else {
		sectoresAtravezados = (CHS.sector) - (cabezal.sector) + (posicion.sector) + 1;
	}
	tiempoSector = sectoresAtravezados * tiempoPorSector;
	printf("sectores recorridos: %d sectores \n", sectoresAtravezados);
	printf("tiempo Sector: %d ms\n", tiempoSector);
	uint16_t tiempoFinal = tiempoPista + tiempoSector;
	printf("el tiempo que tarda en alcanzar la posicion deseada es: %d ms\n", tiempoFinal);
	return tiempoFinal;
}


void leerArchivoConfiguracion(char *path, char* modoInicio, char** IP, char** puerto, char** ID, uint8_t* algoritmo, char** pathConsola, uint16_t* flagDeLog, uint16_t* tiempoLectura, chs_t* CHS, uint16_t* tiempoEscritura, uint16_t* RPM, uint16_t* tiempoSaltoPistas) {
	uint16_t k, i = 0, parametro = 1;
	FILE *archivo = fopen(path, "r");
	char contenido[500];
	char c;
	char aux[20];
	while (!feof(archivo)) {
		fread(&c, 1, 1, archivo);
		if (c != ' ') {
			contenido[i] = c;
			i++;
		}
	}
	contenido[i] = '\0';
	i = 0;
	while (contenido[i] != '\0') {
		while (contenido[i] != ':') {
			i++;
		}
		i++;
		switch (parametro) {
		case 1:
			k = 0;

			while ((contenido[i] != ':') && (k < 8)) {

				modoInicio[k] = contenido[i];
				i++;
				k++;
			}

			modoInicio[k] = '\0';
			k = 0;
			i++;
			while (contenido[i] != ':') {
				i++;
				k++;
			}
			(*IP) = (char*) malloc(k);
			i -= k;
			k = 0;
			while (contenido[i] != ':') {
				(*IP)[k] = contenido[i];
				i++;
				k++;
			}
			(*IP)[k] = '\0';
			i++;
			k = 0;
			while (contenido[i] != '\n') {
				i++;
				k++;
			}
			(*puerto) = (char*) malloc(k);
			i -= k;
			k = 0;
			while (contenido[i] != '\n') {
				(*puerto)[k] = contenido[i];
				i++;
				k++;
			}
			(*puerto)[k] = '\0';
			break;
		case 2:
			aux[0] = contenido[i];
			aux[1] = '\0';
			*algoritmo = atoi(aux);
			break;

		case 3:
			k = 0;

			while (contenido[i] != '\n') {
				i++;
				k++;
			}
			*pathConsola = (char*) malloc((sizeof(char) * k));
			i -= k;
			k = 0;
			while (contenido[i] != '\n') {
				(*pathConsola)[k] = contenido[i];
				i++;
				k++;
			}
			(*pathConsola)[k] = '\0';
			break;
		case 4:
			k = 0;
			while (contenido[i] != '\n') {
				aux[k] = contenido[i];
				k++;
				i++;

			}

			aux[k] = '\0';
			*flagDeLog = atoi(aux);

			break;
		case 5:
			k = 0;
			while (contenido[i] != '\n') {
				i++;
				k++;
			}
			(*ID) = (char*) malloc(k);
			i -= k;
			k = 0;
			while (contenido[i] != '\n') {
				(*ID)[k] = contenido[i];
				i++;
				k++;
			}
			(*ID)[k] = '\0';
			break;
		case 6:
			k = 0;
			while (contenido[i] != ':') {
				aux[k] = contenido[i];
				k++;
				i++;
			}
			aux[k] = '\0';
			(CHS->cilindro) = atoi(aux);
			i++;
			k = 0;
			while (contenido[i] != ':') {
				aux[k] = contenido[i];
				k++;
				i++;
			}
			aux[k] = '\0';
			(CHS->pista) = atoi(aux);
			i++;
			k = 0;
			while (contenido[i] != '\n') {
				aux[k] = contenido[i];
				k++;
				i++;
			}
			aux[k] = '\0';
			(CHS->sector) = atoi(aux);

			break;
		case 7:
			k = 0;
			while (contenido[i] != '\n') {
				aux[k] = contenido[i];
				k++;
				i++;

			}
			aux[k] = '\0';
			*tiempoLectura = atoi(aux);

			break;
		case 8:
			k = 0;
			while (contenido[i] != '\n') {
				aux[k] = contenido[i];
				k++;
				i++;

			}
			aux[k] = '\0';
			*tiempoEscritura = atoi(aux);

			break;
		case 9:
			k = 0;
			while (contenido[i] != '\n') {
				aux[k] = contenido[i];
				k++;
				i++;

			}
			aux[k] = '\0';
			*RPM = atoi(aux);

			break;

		case 10:
			k = 0;
			while (contenido[i] != '\0') {
				aux[k] = contenido[i];
				k++;
				i++;

			}
			aux[k] = '\0';
			*tiempoSaltoPistas = atoi(aux);

			break;

		}
		parametro++;
	}
	fclose(archivo);

	return;
}
